/*--------------------------------------------------------------------------
  
　バックログ１ページずつ

■概要
　このプラグインを入れると
　複数ページに跨るメッセージのバックログを見た場合
　未読のページは表示されなくなります。

　23/06/09　空メッセージ（行数が1行かつ全角スペースまたは半角スペースのみの場合）は消去する機能を追加

■カスタマイズ
　・空メッセージ消去を消去する機能は無効にしたい
　　→「var isSpaceOnlyLogErase = true;」のtrueをfalseにして下さい

■注意事項
　同一ページ内で未読の文字は出てしまいます。
　（１ページのメッセージが長いものを出している途中でバックログを見た時に発生します）

修正内容
21/03/05　新規作成
23/06/09　空メッセージ（行数が1行かつ全角スペースまたは半角スペースのみの場合）はバックログから消去する機能を追加
23/12/31　プラグインでマップコマンドにバックログを追加した場合、空のバックログが表示されるバグを修正


■対応バージョン
　SRPG Studio Version:1.288


■規約
・利用はSRPG Studioを使ったゲームに限ります。
・商用・非商用問いません。フリーです。
・加工等、問題ありません。どんどん改造してください。
・クレジット明記無し　OK
・再配布、転載　OK
・wiki掲載　OK
・SRPG Studio利用規約は遵守してください。
  
--------------------------------------------------------------------------*/

(function() {

//--------------------------------------
// 設定
//--------------------------------------
var isSpaceOnlyLogErase = true;	// ログが一行のみかつ（全角スペース1つor半角スペース1つ）なら消すか（true:消す false:従来通り）




//-------------------------------------
// MessageViewControlクラス
//-------------------------------------
MessageViewControl._parentObj = null;

var alias01 = MessageViewControl.reset;
MessageViewControl.reset= function() {
	alias01.call(this);
	
	this._parentObj = null;
};


var alias02 = MessageViewControl.moveBacklog;
MessageViewControl.moveBacklog= function() {
		var isBacklogStart = false;
		
		if (this._backlogWindow === null && this._isBacklogInput()) {
			isBacklogStart = true;
		}
		
		var result = alias02.call(this);
		
		if ( isBacklogStart === true && this._parentObj != null ) {
			if( this._parentObj.isTextEnd() !== true ) {
				this._backlogWindow = createWindowObject(BacklogWindow);
				this._backlogWindow.setWindowData2(this._parentObj.getRowCount());
			}
		}
		
		return result;
}


MessageViewControl.setParentObj= function(parentObj) {
		this._parentObj = parentObj;
}


MessageViewControl.resetParentObj= function(resetObj) {
		if( this._parentObj === resetObj ) {
			this._parentObj = null;
		}
}




//-------------------------------------
// BacklogWindowクラス
//-------------------------------------
//---------------------------------------
// BacklogWindowクラス
//---------------------------------------

// 通常のバックログ用
BacklogWindow._setBacklogObject= function() {
		var i, j, arr, count2, command;
		var object = {};
		var count = root.getBacklogCommandCount();
		
		for (i = 0; i < count; i++) {
			command = root.getBacklogCommand(i);
			arr = this._getBacklogText(command);
			count2 = arr.length;
			for (j = 0; j < count2; j++) {
				// 行数が1行かつ全角スペースまたは半角スペースのみだった場合は登録しない
				if( isSpaceOnlyLogErase === true ) {
					// 行数が1行かつ全角スペースまたは半角スペースのみだった場合は登録しない
					if( count2 === 1 && (arr[j] === '　' || arr[j] === ' ') ){
						break;
					}
				}
				
				if ((j % 3) === 0) {
					object = {};
					object.command = command;
					object.textArray = [];
					object.voiceName = '';
					this._scrollbar.objectSet(object);
				}
				
				object.textArray.push(arr[j]);
			}
		}
		
		this._scrollbar.objectSetEnd();
		
		this._checkVoice();
}


// バックログを1ページずつにする処理用
BacklogWindow.setWindowData2= function(rowCount) {
		var count = Math.floor(root.getGameAreaHeight() / 70);
		
		this._scrollbar = createScrollbarObject(BacklogScrollbar, this);
		this._scrollbar.setScrollFormation(1, count);
		this._scrollbar.setActive(true);
		
		this._setBacklogObject2(rowCount);
		this._setFirstIndex();
}


// バックログを1ページずつにする処理用
BacklogWindow._setBacklogObject2= function(rowCount) {
		var i, j, arr, count2, command;
		var object = {};
		var count = root.getBacklogCommandCount()-1;
		
		for (i = 0; i < count; i++) {
			command = root.getBacklogCommand(i);
			arr = this._getBacklogText(command);
			count2 = arr.length;
			for (j = 0; j < count2; j++) {
				// 行数が1行かつ全角スペースまたは半角スペースのみだった場合は登録しない
				if( isSpaceOnlyLogErase === true ) {
					if( count2 === 1 && (arr[j] === '　' || arr[j] === ' ') ){
						break;
					}
				}
				
				if ((j % 3) === 0) {
					object = {};
					object.command = command;
					object.textArray = [];
					object.voiceName = '';
					this._scrollbar.objectSet(object);
				}
				
				object.textArray.push(arr[j]);
			}
		}
		
		// 一番最後のテキストは指定行までセット
		command = root.getBacklogCommand(i);
		arr = this._getBacklogText(command);
		count2 = arr.length;
		for (j = 0; j < count2 && j < rowCount; j++) {
			if ((j % 3) === 0) {
				object = {};
				object.command = command;
				object.textArray = [];
				object.voiceName = '';
				this._scrollbar.objectSet(object);
			}
			
			object.textArray.push(arr[j]);
		}
		
		this._scrollbar.objectSetEnd();
		
		this._checkVoice();
}


//-------------------------------------
// BaseMessageViewクラス
//-------------------------------------
var alias10 = BaseMessageView.setupMessageView;
BaseMessageView.setupMessageView= function(messageViewParam) {
		alias10.call(this, messageViewParam);
		
		MessageViewControl.setParentObj(this);
}



var alias11 = BaseMessageView.endMessageView;
BaseMessageView.endMessageView= function() {
		alias11.call(this);
		
		MessageViewControl.resetParentObj(this);
}


BaseMessageView.isTextEnd= function() {
		var coreAnalyzer = this._messageAnalyzer.getCoreAnalyzer();
		
		return coreAnalyzer.isTextEnd();
}


BaseMessageView.getRowCount= function() {
		var i;
		var coreAnalyzer = this._messageAnalyzer.getCoreAnalyzer();
		var text = coreAnalyzer._totalText.substring(0,coreAnalyzer._totalIndex-1);
		var count = text.length;
		var j = 1;
		
		for (i = 0; i < count; i++) {
			c = text.charAt(i);
			if (c === '\n' ) {
				j++;
			}
		}
		
		return j;
}




//-------------------------------------
// CoreAnalyzerクラス
//-------------------------------------
CoreAnalyzer.isTextEnd= function() {
		var textLine = this._textLineArray[this._rowCount];
		
		// 一行の終端までチェックし終えてない場合はfalse
		if (textLine.currentIndex !== textLine.text.length) {
			return false;
		}
		
		// ブロック内の行を全て処理したか調べる
		if (this._rowCount + 1 === this._textLineArray.length) {
			if (this._totalIndex >= this._totalText.length) {
				// これ以上メッセージは存在しないためtrue
				return true;
			}
		}
		
		return false;
}


})();